#ifndef _SPI_H_
#define _SPI_H_

#include "sc95fx.h"
#include "GPIO.h"

// USXINX

#define USCI2 2
#define USCI3 3
#define USCI4 4

// OCTON

#define USMD1 (BITS(6, 7))
#define USMD0 (BITS(4, 5))

// TMCON

#define USMD2 (BITS(6, 7))
#define USMD3 (BITS(4, 5))
#define USMD4 (BITS(2, 3))
#define TON_SPI   0b01
#define TON_TWI   0b10
#define TON_UART  0b11

// US0CON0
// US1CON0
// USXCON0

#define SPEN        BIT(7)      // 1:打开SPI 0:关闭SPI
#define MSTR        BIT(5)      // 1:从SPI 0:主SPI
#define CPOL        BIT(4)      // 0:SCK在空闲状态下为低电平 1:SCK在空闲状态下为高电平
#define CPHA        BIT(3)      // 0:SCK周期的第一沿采集数据 1:SCK周期的第二沿采集数据
#define SPR         (BITS(0,2)) // SPI的时钟速率
#define SPR_FSYS    0           // : fsys
#define SPR_FSYS2   1           // fsys/2
#define SPR_FSYS4   2           // fsys/4
#define SPR_FSYS8   3
#define SPR_FSYS16  4
#define SPR_FSYS32  5
#define SPR_FSYS64  6
#define SPR_FSYS128 7           // fsys/128

// US0CON1
// US1CON1
// USXCON1

#define SPIF        BIT(7)  // 数据传送标志位 1:已完成数据传输, 软件清0
#define WCOL        BIT(6)  // 写入冲突标志位 1:发生写入冲突, 软件清0
#define TXE         BIT(3)  // 发送缓冲器空标志 1:发送缓冲器空, 软件清0
#define DORD        BIT(2)  // 传送方向选择位 1:MSB优先 0:LSB优先
#define SPMD        BIT(1)  // SPI 传输模式选择 1:16位 0:8位
#define SPMD_bit8   0
#define SPMD_bit16  BIT(1)
#define TBIE        BIT(0)  // 发送完成中断允许标志位 1:打开中断 0:禁止中断

// US0CON2
// US1CON2
// USXCON2

// US0CON3
// US1CON3
// USXCON3

#define SPI0 0
#define SPI1 1
#define SPI2 2
#define SPI3 3
#define SPI4 4

#define SPI0_SCK

void SPI_init(uint8_t SPIx);
void SPI_setSize(uint8_t SPIx, uint8_t size);
void SPI_begin(uint8_t SPIx);
bool SPI_sendFinish(uint8_t SPIx);
void SPI_sendWord(uint8_t SPIx, uint16_t word);
uint16_t SPI_receiveWord(uint8_t SPIx);
void SPI_clearFlag(uint8_t SPIx);
void SPI_end(uint8_t SPIx);

#endif
